home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / pao / towns / paolib / cdp / cdptest.c < prev    next >
Text File  |  1991-10-18  |  42KB  |  1,108 lines

  1. /* << High C V1.4 >> **********************************************************
  2. **
  3. **    CD簡易演奏ライブラリの試験プログラム
  4. **
  5. **    1991.02.09 : CREATE
  6. **    1991.02.15 : FINISH
  7. **
  8. **    < HISTORY >
  9. **    1991.02.09 : CREATE
  10. **    1991.02.19 : SHUFFLE機能の追加.
  11. **    1991.05.30 : 清書
  12. **
  13. **    < note > : TABS = 4
  14. **
  15. **    このプログラムは,コンソール上で動作させて下さい.
  16. **
  17. **    Programmed by Y.Hirata ( Nifty ID : NAB03321 )
  18. **
  19. ******************************************************************************/
  20.  
  21. /*-----------------------------------------------------------------------------
  22. **    CDP.LIB 使用上の注意事項
  23. **
  24. **    1.
  25. **    ヘッダファイル CDP.H をインクルードして下さい. CDR.H はインクルードする必要ありません.
  26. **
  27. **    2.
  28. **    使用する関数は、CDP_****() だけにして下さい.
  29. **    PAUSE中とかに、別関数を使用して PAUSE/STOP した場合に、続きの処理が保証
  30. **    されません.
  31. **
  32. **    3.
  33. **    LINK時には、CDP.LIB の他に CDR.LIB もLINKして下さい.
  34. **    また、LINKオプション -CALLBUFS に 2 以上の値を指定して下さい.
  35. **    TWOCASE でLINKして下さい.
  36. -----------------------------------------------------------------------------*/
  37.  
  38. #include <stdio.h>
  39. #include "cdp.h"
  40. #include <mos.h>
  41. #include <snd.h>
  42.  
  43. #define    MworkSize    4096                        /*  マウス作業域のサイズ            */
  44. char    Mwork[MworkSize] ;                        /*  マウス作業域                */
  45.  
  46. #define    MOS_LEFT    1                            /*  マウス左クリック                */
  47. #define    MOS_RIGHT    2                            /*  マウス右クリック                */
  48. #define    MOS_BOTH    3                            /*  マウス左右クリック                */
  49.  
  50. #define    LOCATE(x,y)    printf("\x1b[%d;%dH",y,x)
  51. #define    CLS()        printf("\x1b[2J")
  52. #define    CR()        printf("\n");
  53. #define    CURON()        printf("\x1b[0v");
  54. #define    CUROFF()    printf("\x1b[1v");
  55.  
  56. #define    CDC_WAIT    5000                        /*  適当な値                */
  57.  
  58. /*******************************  マウス制御を待つ  *****************************/
  59. void mosloop( int sw,int *mbot,int *mx,int *my )
  60. {
  61.     do {
  62.         MOS_rdpos( mbot,mx,my ) ;
  63.     } while ( *mbot == sw ) ;
  64. }
  65.  
  66. /*******************************  TOC 情報表示  *****************************/
  67. void tocdisp()
  68. {
  69.     char    minw ;
  70.     int        c ;
  71.  
  72. /*-----------------------------------------------------------------------------
  73. **    TOC 情報は、CDP_INFO_buf. に格納されています.
  74. **
  75. **    他の時間情報は、それぞれ・・・
  76. **    CDP_INFO_buf.discend    : 全時間
  77. **    CDP_INFO_buf.track[0]    : TOC 時間(TOC情報格納部分)
  78. **    CDP_TIME_music            : 全演奏時間
  79. **    CDP_TIME_data            : 全データ時間
  80. **    注意 : 全時間は、TOC時間 + 全データ時間 + 全演奏時間 + 1フレーム となります.
  81. **    CDP_TIME_track[]        : 各トラックの演奏(データ)時間
  82. **    となっています.
  83. **
  84. **    トラック内がデータなのか音楽なのかは、次の方法で確認できます.
  85. **    (1) CDP_INFO_buf.track[] に格納されている時間の再上位ビットがON/OFFで確認.
  86. **        ON ならば データ , OFFならば 音楽 です.
  87. **    (2) CDP_data_check(曲番号 1~99) をCALLし、そのリターン値で確認.
  88. **        リターン値が 真 ならば データ , 偽 ならば 音楽 です.
  89. -----------------------------------------------------------------------------*/
  90.     printf( "\n\n" ) ;
  91.     minw = CDP_INFO_buf.track[0].min ;
  92.     if ( ( minw & 0x80 ) == 0x80 ) minw &= 0x7f ;
  93.     printf( "開始曲番号 : %d , 終了曲番号 : %d\n",CDP_INFO_buf.start,CDP_INFO_buf.end ) ;
  94.     printf( "曲数 : %d, 総時間 : %02d-%02d-%02d , TOC 時間 : %02d-%02d-%02d\n",CDP_INFO_buf.end,CDP_INFO_buf.discend.min,CDP_INFO_buf.discend.sec,CDP_INFO_buf.discend.frame,minw,CDP_INFO_buf.track[0].sec,CDP_INFO_buf.track[0].frame ) ;
  95.     printf( "総演奏時間 : %02d-%02d-%02d , 総データ時間 : %02d-%02d-%02d\n",
  96.         CDP_TIME_music.min,CDP_TIME_music.sec,CDP_TIME_music.frame,
  97.         CDP_TIME_data.min,CDP_TIME_data.sec,CDP_TIME_data.frame ) ;
  98.     for ( c=0; c<CDP_INFO_buf.end; c++ ) {
  99.         printf( "%02d : %02d-%02d-%02d ; ",c+1,CDP_TIME_track[c].min,
  100.             CDP_TIME_track[c].sec,CDP_TIME_track[c].frame ) ;
  101.         if ( CDP_data_check( c+1 ) ) printf( "データ\n" ) ;
  102.         else printf( "音楽\n" ) ;
  103.     }
  104. }
  105.  
  106. /********************************  演奏時間表示  *****************************/
  107. void timedisp()
  108. {
  109. /*-----------------------------------------------------------------------------
  110. **    演奏時間の情報は、CDP_status() をCALLすることによって取得できます.
  111. **
  112. **    演奏情報は、それぞれ・・・
  113. **    CDP_NOW_status            : 現在の演奏状態
  114. **
  115. **    CDP_NOW_musicno            : 演奏中の曲番号
  116. **    CDP_CLOCK_nowtrack        : 演奏中の曲内経過時間
  117. **    CDP_CLOCK_nowdisc        : 演奏中のトータル経過時間
  118. **    CDP_TIME_nowtrack        : 演奏中の曲内残り時間
  119. **    CDP_TIME_nowdisc        : 演奏中のトータル残り時間
  120. **    となっています.
  121. -----------------------------------------------------------------------------*/
  122.  
  123. /*-----------------------------------------------------------------------------
  124. **    1曲演奏時に、演奏終了する前に次の曲の頭を少し演奏してしまうことがあるの
  125. **    で、表示する際には、チェックをする必要がある.
  126. -----------------------------------------------------------------------------*/
  127.     if ( CDP_NOW_start == CDP_NOW_end )        /*  一曲演奏時                */
  128.         if ( CDP_NOW_start != CDP_NOW_musicno ) return ;
  129.  
  130.     LOCATE( 1,25 ) ;
  131.     printf( "<%02d/%02d> %02d-%02d-%02d [-%02d-%02d-%02d] : %02d-%02d-%02d [-%02d-%02d-%02d]",CDP_NOW_musicno,CDP_INFO_buf.end,CDP_CLOCK_nowtrack.min,CDP_CLOCK_nowtrack.sec,CDP_CLOCK_nowtrack.frame,CDP_TIME_nowtrack.min,CDP_TIME_nowtrack.sec,CDP_TIME_nowtrack.frame,CDP_CLOCK_nowdisc.min,CDP_CLOCK_nowdisc.sec,CDP_CLOCK_nowdisc.frame,CDP_TIME_nowdisc.min,CDP_TIME_nowdisc.sec,CDP_TIME_nowdisc.frame ) ;
  132. }
  133.  
  134. /******************************  一時停止時間表示  ***************************/
  135. void pausedisp()
  136. {
  137. /*-----------------------------------------------------------------------------
  138. **    PAUSE時間の情報は、演奏状態に CDP_pause() をCALLした時点で登録されます.
  139. **    また、CDP_fftime() か CDP_rewtime()をCALLした時点で変更されます.
  140. **
  141. **    演奏情報は、それぞれ・・・
  142. **    CDP_NOW_pause        : PAUSE時の曲番号
  143. **    CDP_CLOCK_pause        : PAUSE時の曲内経過時間
  144. **    CDP_CLOCK_pausedisc    : PAUSE時のトータル経過時間
  145. **    となっています.
  146. -----------------------------------------------------------------------------*/
  147.     printf( "PAUSE TIME : <%02d> %02d-%02d-%02d [%02d-%02d-%02d]\n",CDP_NOW_pause,CDP_CLOCK_pause.min,CDP_CLOCK_pause.sec,CDP_CLOCK_pause.frame,CDP_CLOCK_pausedisc.min,CDP_CLOCK_pausedisc.sec,CDP_CLOCK_pausedisc.frame ) ;
  148. }
  149.  
  150. /********************************  前後演奏試験  *****************************/
  151. void test1()
  152. {
  153.     int        mbot, mx, my ;                        /*  マウス状態格納変数            */
  154.     int        dbot, dx, dy ;                        /*  マウス状態格納変数            */
  155.     int        c ;
  156.     int        ret ;
  157.  
  158.     printf( "\nNEXT / BEFORE PLAY TEST\n" ) ;
  159.     printf( "左クリックで前の曲 , 右クリックで次の曲 , 左右同時クリックで終了\n" ) ;
  160.  
  161. /*-----------------------------------------------------------------------------
  162. **    演奏を開始する時に、演奏開始曲/終了曲等の各パラメタを設定する必要がある場合に
  163. **    は、必ず前もって CDP_status() か CDP_tocread() をCALLしておく必要があり
  164. **    ます. 
  165. **    ただし、最初だけであり、一度でも CDP_*****() をCALLしていれば、必要ありま
  166. **    せん.
  167. **    
  168. **    演奏開始曲番号は、CDP_NOW_start にセットします.(省略値は、最初の曲)
  169. **    演奏終了曲番号は、CDP_NOW_end にセットします.(省略値は、最後の曲)
  170. **    繰り返し演奏回数は、CDP_REP_cnt にセットします.(省略値は、1回)
  171. **    ただし、これらのパラメタに誤りがあると、CDP_****() は、パラメタエラーを返します.
  172. **
  173. **    注意 : CDが入れ換えられると新たにTOCが読み直され、演奏開始~終了位置(曲番
  174. **           号および時間)が初期値(省略値)に設定されます.
  175. -----------------------------------------------------------------------------*/
  176.     CUROFF() ;
  177.     c = 0 ;
  178.     ret = CDP_status() ;
  179.     if ( CDP_NOW_status == CDP_STAT_PLAY ) {        /*  演奏中                */
  180.         timedisp() ;
  181.     }
  182.     if ( ret == CDP_ERR_CHANGE ) {                    /*  CDが入れ換えられた    */
  183.         CDP_play() ;
  184.         tocdisp() ;
  185.     }
  186.     do {
  187.         MOS_rdpos( &mbot,&mx,&my ) ;
  188.         if ( mbot == MOS_LEFT && CDP_NOW_status != CDP_STAT_NOTREADY ) {
  189.                                                     /*  マウス左クリック            */
  190. /*-----------------------------------------------------------------------------
  191. **    あらかじめ演奏状態を取得しておいて・・・・
  192. **    
  193. **    現在演奏中の曲番号に対して、一つ後ろの曲を CDP_NOW_start にセットして
  194. **    CDP_play() をCALLし、演奏する.
  195. -----------------------------------------------------------------------------*/
  196.             CDP_NOW_start = CDP_NOW_musicno + 1 ;
  197.             printf( "\n\nNEXT PLAY ... %d 曲目\n",
  198.                     CDP_NOW_start ) ;
  199.             CDP_debug_dispmsg( CDP_play() ) ;
  200. /*-----------------------------------------------------------------------------
  201. **    デバッグ用に CDP_status() をCALLしていますが、CDP_play() をCALLした直後
  202. **    であれば、CDP_status() をCALLしなくても、情報はグローバル変数にセットされてい
  203. **    ます.
  204. -----------------------------------------------------------------------------*/
  205.             printf( "実際の演奏曲は、%d 曲目 ~ %d 曲目\n演奏後の状態 ... ",CDP_NOW_start,CDP_NOW_end ) ;
  206.             CDP_debug_dispmsg( CDP_status() ) ;
  207.             mosloop( MOS_LEFT,&dbot,&dx,&dy ) ;        /*  左クリック開放を待つ    */
  208.  
  209.         }
  210.         if ( mbot == MOS_RIGHT && CDP_NOW_status != CDP_STAT_NOTREADY ) {
  211.                                                     /*  マウス右クリック            */
  212. /*-----------------------------------------------------------------------------
  213. **    あらかじめ演奏状態を取得しておいて・・・・
  214. **    
  215. **    現在演奏中の曲番号に対して、一つ前の曲を CDP_NOW_start にセットして
  216. **    CDP_play() をCALLし、演奏する.
  217. -----------------------------------------------------------------------------*/
  218.             CDP_NOW_start = CDP_NOW_musicno - 1 ;
  219.             printf( "\n\nBEFORE PLAY ... %d 曲目\n",
  220.                     CDP_NOW_start ) ;
  221.             CDP_debug_dispmsg( CDP_play() ) ;
  222. /*-----------------------------------------------------------------------------
  223. **    デバッグ用に CDP_status() をCALLしていますが、CDP_play() をCALLした直後
  224. **    であれば、CDP_status() をCALLしなくても、情報はグローバル変数にセットされてい
  225. **    ます.
  226. -----------------------------------------------------------------------------*/
  227.             printf( "実際の演奏曲は、%d 曲目 ~ %d 曲目\n演奏後の状態 ... ",CDP_NOW_start,CDP_NOW_end ) ;
  228.             CDP_debug_dispmsg( CDP_status() ) ;
  229.             mosloop( MOS_RIGHT,&dbot,&dx,&dy ) ;    /*  右クリック開放を待つ    */
  230.         }
  231.  
  232. /*-----------------------------------------------------------------------------
  233. **    演奏中にCDの情報を取得する時には、以前取得した時よりも 200ms 以上の wait
  234. **    をおいてからにして下さい. そうしないと、音飛びなどの現象を起こします.
  235. -----------------------------------------------------------------------------*/
  236.         if ( c < CDC_WAIT ) {                        /*  wait                */
  237.             c++ ;
  238.         } else {
  239.             c = 0 ;
  240. /*-----------------------------------------------------------------------------
  241. **    演奏中ならば演奏時間の情報を表示し、CDが入れ換えられたならば、最初から演奏
  242. **    し直します.
  243. -----------------------------------------------------------------------------*/
  244.             ret = CDP_status() ;
  245.             if ( CDP_NOW_status == CDP_STAT_PLAY ) {
  246.                 timedisp() ;
  247.             }
  248.             if ( ret == CDP_ERR_CHANGE ) {
  249.                 CDP_play() ;
  250.                 tocdisp() ;
  251.             }
  252.         }
  253.  
  254.     } while ( mbot != MOS_BOTH ) ;                    /*  左右同時クリックで終了    */
  255.     CURON() ;
  256. }
  257.  
  258. /********************************  一時停止試験  *****************************/
  259. void test2()
  260. {
  261.     int        mbot, mx, my ;                        /*  マウス状態格納変数            */
  262.     int        dbot, dx, dy ;                        /*  マウス状態格納変数            */
  263.     int        c ;
  264.     int        ret ;
  265.  
  266.     printf( "\nPAUSE ON/OFF PLAY TEST\n" ) ;
  267.     printf( "左クリックでPAUSE ON/OFF , 右クリックで頭出し演奏 , 左右同時クリックで終了\n" ) ;
  268.  
  269. /*-----------------------------------------------------------------------------
  270. **    PAUSE処理は、CDP_pause() をCALLすることによって、PAUSE ON/OFF をします.
  271. **    注意 : 本ライブラリ以外の関数を使用して CD演奏をSTOP/PAUSE した後の処理につい
  272. **           ては、動作が保証されません.
  273. -----------------------------------------------------------------------------*/
  274.     CUROFF() ;
  275.     c = 0 ;
  276.     do {
  277.         MOS_rdpos( &mbot,&mx,&my ) ;
  278. /*-----------------------------------------------------------------------------
  279. **    PAUSE時に、CDP_pause() をCALLすることによって、PAUSE解除となりますが、
  280. **    この時に、CDP_FLG_pauseplay によって動作が異なります.
  281. **
  282. **    CDP_FLG_pauseplay が 真 ならば、
  283. **    CDP_NOW_start, CDP_NOW_end, CDP_CLOCK_start, CDP_CLOCK_end の値に
  284. **    従って演奏処理されます.
  285. **    (CDP_CLOCK_start,CDP_CLOCK_endは、アプリケーション側で値を変更しないで下さい.
  286. **    CDP_play(), CDP_fftime(), CDP_rewtime() で設定される変数です.)
  287. **
  288. **    CDP_FLG_pauseplay が 偽 ならば、
  289. **    PAUSE時点から、演奏が再開(CONTINUE)されます.
  290. **
  291. **    注意 : 本ライブラリ以外の関数を使用して CD演奏をSTOP/PAUSE した後の処理につい
  292. **           ては、動作が保証されません.
  293. **
  294. **           また、CDP_FLG_pauseplay が 真 の値になっていないと、PAUSE中に演奏
  295. **           処理(CDP_play())を行うことができません.
  296. -----------------------------------------------------------------------------*/
  297.         if ( mbot == MOS_LEFT && CDP_NOW_status != CDP_STAT_NOTREADY ) {
  298.                                                     /*  左クリック                */
  299.             CDP_pause() ;
  300.             if ( CDP_NOW_status != CDP_STAT_PAUSE ) {
  301.                 printf( "\nPAUSE 解除 !\n" ) ;
  302.             } else {
  303.                 printf( "\nPAUSE ...\n" ) ;
  304.                 pausedisp() ;
  305.             }
  306.             mosloop( MOS_LEFT,&dbot,&dx,&dy ) ;        /*  左クリック開放を待つ    */
  307.  
  308.         }
  309.         if ( mbot == MOS_RIGHT && CDP_NOW_status != CDP_STAT_NOTREADY ) {
  310.                                                     /*  右クリック                */
  311. /*-----------------------------------------------------------------------------
  312. **    頭出し演奏をします.
  313. **
  314. **    PAUSE中ならば、
  315. **    CDP_FLG_pauseplay を 真 にし、CDP_NOW_start に演奏開始曲番号をセットします.
  316. **
  317. **    演奏中ならば、
  318. **    CDP_NOW_start に演奏中の曲番号をセットします.
  319. **
  320. **    停止中ならば、
  321. **    最初の曲番号をセットします.
  322. -----------------------------------------------------------------------------*/
  323.             switch ( CDP_NOW_status ) {
  324.                 case CDP_STAT_PAUSE :
  325.                     CDP_FLG_pauseplay = CDP_TRUE ;
  326.                     CDP_NOW_start = CDP_NOW_pause ;
  327.                     break ;
  328.                 case CDP_STAT_PLAY :
  329.                     CDP_NOW_start = CDP_NOW_musicno ;
  330.                     break ;
  331.                 case CDP_STAT_STOP :
  332.                     CDP_NOW_start = CDP_INFO_buf.start ;
  333.                     break ;
  334.             }
  335.             CDP_play() ;
  336.             mosloop( MOS_RIGHT,&dbot,&dx,&dy ) ;    /*  右クリック開放を待つ    */
  337.         }
  338.  
  339. /*-----------------------------------------------------------------------------
  340. **    演奏中にCDの情報を取得する時には、以前取得した時よりも 200ms 以上の wait
  341. **    をおいてからにして下さい. そうしないと、音飛びなどの現象を起こします.
  342. -----------------------------------------------------------------------------*/
  343.         if ( c < CDC_WAIT ) {                        /*  wait                */
  344.             c++ ;
  345.         } else {
  346.             c = 0 ;
  347. /*-----------------------------------------------------------------------------
  348. **    演奏中ならば演奏時間の情報を表示し、CDが入れ換えられたならば、最初から演奏
  349. **    し直します.
  350. -----------------------------------------------------------------------------*/
  351.             ret = CDP_status() ;
  352.             if ( CDP_NOW_status == CDP_STAT_PLAY ) {
  353.                 timedisp() ;
  354.             }
  355.             if ( ret == CDP_ERR_CHANGE ) {
  356.                 CDP_play() ;
  357.                 tocdisp() ;
  358.             }
  359.         }
  360.  
  361.     } while ( mbot != MOS_BOTH ) ;                    /*  左右同時クリックで終了    */
  362.     CURON() ;
  363. }
  364.  
  365. /***************************  先送り後戻り演奏試験  **************************/
  366. void test3()
  367. {
  368.     int        mbot, mx, my ;                        /*  マウス状態格納変数            */
  369.     int        dbot, dx, dy ;                        /*  マウス状態格納変数            */
  370.     int        c ;
  371.     int        ret ;
  372.  
  373.     printf( "\nFF / REW  PLAY TEST\n" ) ;
  374.     printf( "左クリックで先送り , 右クリックで後戻り , 左右同時クリックで終了\n" ) ;
  375.  
  376. /*-----------------------------------------------------------------------------
  377. **    先送り/後戻り演奏をする前には、必ず CDP_pause() をCALLして下さい.
  378. **    PAUSE状態でないと、動作しません.
  379. **    先送り/後戻りの時間設定が終わったら、再度 CDP_pause() をCALLして、PAUSE
  380. **    状態を解除して下さい.
  381. **
  382. **    注意 : CDP_pause() をCALLして、PAUSE状態を解除する時に、CDP_FLG_pauseplay
  383. **           の値が 偽 であると、PAUSE時点から演奏を再開(CONTINUE)します.
  384. **           CDP_fftime(), CDP_rewtime() をCALLすると、
  385. **           CDP_FLG_pauseplay の値は、真 となります.
  386. **           故意に、PAUSE時点から演奏再開をしたい場合にだけ、CDP_FLG_pauseplay
  387. **           の値を操作(偽にする)して下さい.
  388. -----------------------------------------------------------------------------*/
  389.     CUROFF() ;
  390.     c = 0 ;
  391.     do {
  392.         MOS_rdpos( &mbot,&mx,&my ) ;
  393.         if ( mbot == MOS_LEFT && CDP_NOW_status != CDP_STAT_NOTREADY ) {
  394.                                                     /*  左クリック                */
  395. /*-----------------------------------------------------------------------------
  396. **    CDP_fftime() では、CDP_FFREW_SEC の時間[秒]分だけ、時間が進みます.
  397. **    演奏可能時間を過ぎたら、パラメタエラーの値が返ってきます.
  398. -----------------------------------------------------------------------------*/
  399.             CDP_pause() ;
  400.             do {
  401.                 if ( CDP_NOW_status != CDP_STAT_PAUSE ) break ;
  402.                 ret = CDP_fftime() ;
  403.                 if ( ret ) {
  404.                     mosloop( MOS_LEFT,&dbot,&dx,&dy ) ;
  405.                     break ;
  406.                 } else {
  407.                     timedisp() ;
  408.                 }
  409.                 MOS_rdpos( &dbot,&dx,&dy ) ;
  410.             } while ( dbot == MOS_LEFT ) ;
  411.             CDP_pause() ;
  412.  
  413.         }
  414.         if ( mbot == MOS_RIGHT && CDP_NOW_status != CDP_STAT_NOTREADY ) {
  415.                                                     /*  右クリック                */
  416. /*-----------------------------------------------------------------------------
  417. **    CDP_rewtime() では、CDP_FFREW_SEC の時間[秒]分だけ、時間が戻ります.
  418. **    一番頭の時間まで戻ったら、パラメタエラーの値が返ってきます.
  419. -----------------------------------------------------------------------------*/
  420.             CDP_pause() ;
  421.             do {
  422.                 ret = CDP_rewtime() ;
  423.                 if ( ret ) {
  424.                     mosloop( MOS_RIGHT,&dbot,&dx,&dy ) ;
  425.                     break ;
  426.                 } else {
  427.                     timedisp() ;
  428.                 }
  429.                 MOS_rdpos( &dbot,&dx,&dy ) ;
  430.             } while ( dbot == MOS_RIGHT ) ;
  431.             CDP_pause() ;
  432.         }
  433.  
  434. /*-----------------------------------------------------------------------------
  435. **    演奏中にCDの情報を取得する時には、以前取得した時よりも 200ms 以上の wait
  436. **    をおいてからにして下さい. そうしないと、音飛びなどの現象を起こします.
  437. -----------------------------------------------------------------------------*/
  438.         if ( c < CDC_WAIT ) {                        /*  wait                */
  439.             c++ ;
  440.         } else {
  441.             c = 0 ;
  442. /*-----------------------------------------------------------------------------
  443. **    演奏中ならば演奏時間の情報を表示し、CDが入れ換えられたならば、最初から演奏
  444. **    し直します.
  445. -----------------------------------------------------------------------------*/
  446.             ret = CDP_status() ;
  447.             if ( CDP_NOW_status == CDP_STAT_PLAY ) {
  448.                 timedisp() ;
  449.             }
  450.             if ( ret == CDP_ERR_CHANGE ) {
  451.                 CDP_play() ;
  452.                 tocdisp() ;
  453.             } else if ( CDP_NOW_status == CDP_STAT_STOP ) {
  454.                 printf( "\n演奏終了しました.\n" ) ;
  455.                 break ;
  456.             }
  457.         }
  458.  
  459.     } while ( mbot != MOS_BOTH ) ;                    /*  左右同時クリックで終了    */
  460.     CURON() ;
  461. }
  462.  
  463. /***************************  先送り後戻り演奏試験  **************************/
  464. void test4()
  465. {
  466.     int        mbot, mx, my ;                        /*  マウス状態格納変数            */
  467.     int        dbot, dx, dy ;                        /*  マウス状態格納変数            */
  468.     int        pbot, px, py ;                        /*  マウス状態格納変数            */
  469.     int        c ;
  470.     int        ret ;
  471.  
  472.     printf( "\nPAUSE & FF / REW  PLAY TEST\n" ) ;
  473.     printf( "左クリックでPAUSE ON/OFF , 右クリックでPAUSEキャンセル , 左右同時クリックで終了\n" ) ;
  474.     printf( "PAUSE中に 左クリックで FF , 右クリックで REW , 左右同時クリックで EXIT\n" ) ;
  475.  
  476. /*-----------------------------------------------------------------------------
  477. **    先送り/後戻り演奏をする前には、必ず CDP_pause() をCALLして下さい.
  478. **    PAUSE状態でないと、動作しません.
  479. **    先送り/後戻りの時間設定が終わったら、再度 CDP_pause() をCALLして、PAUSE
  480. **    状態を解除して下さい.
  481. **
  482. **    注意 : CDP_pause() をCALLして、PAUSE状態を解除する時に、CDP_FLG_pauseplay
  483. **           の値が 偽 であると、PAUSE時点から演奏を再開(CONTINUE)します.
  484. **           CDP_fftime(), CDP_rewtime() をCALLすると、
  485. **           CDP_FLG_pauseplay の値は、真 となります.
  486. **           故意に、PAUSE時点から演奏再開をしたい場合にだけ、CDP_FLG_pauseplay
  487. **           の値を操作(偽にする)して下さい.
  488. -----------------------------------------------------------------------------*/
  489.     CUROFF() ;
  490.     c = 0 ;
  491.     do {
  492.         MOS_rdpos( &mbot,&mx,&my ) ;
  493.         if ( mbot == MOS_LEFT && CDP_NOW_status != CDP_STAT_NOTREADY ) {
  494.                                                     /*  左クリック                */
  495.             CDP_pause() ;
  496.             printf( "\nNOW PAUSE!\n" ) ;
  497.             pausedisp() ;
  498.             printf( "\n左クリックで FF , 右クリックで REW , 左右同時クリックで EXIT\n" ) ;
  499.             timedisp() ;
  500.  
  501.             do {
  502.                 MOS_rdpos( &pbot,&px,&py ) ;
  503.                 if ( pbot == MOS_LEFT ) {
  504. /*-----------------------------------------------------------------------------
  505. **    CDP_fftime() では、CDP_FFREW_SEC の時間[秒]分だけ、時間が進みます.
  506. **    演奏可能時間を過ぎたら、パラメタエラーの値が返ってきます.
  507. -----------------------------------------------------------------------------*/
  508.                     do {
  509.                         ret = CDP_fftime() ;
  510.                         if ( ret ) {
  511.                             mosloop( MOS_LEFT,&dbot,&dx,&dy ) ;
  512.                             break ;
  513.                         } else {
  514.                             timedisp() ;
  515.                         }
  516.                         MOS_rdpos( &dbot,&dx,&dy ) ;
  517.                     } while ( dbot == MOS_LEFT ) ;
  518.                 } else if ( pbot == MOS_RIGHT ) {
  519. /*-----------------------------------------------------------------------------
  520. **    CDP_rewtime() では、CDP_FFREW_SEC の時間[秒]分だけ、時間が戻ります.
  521. **    一番頭の時間まで戻ったら、パラメタエラーの値が返ってきます.
  522. -----------------------------------------------------------------------------*/
  523.                     do {
  524.                         ret = CDP_rewtime() ;
  525.                         if ( ret ) {
  526.                             mosloop( MOS_RIGHT,&dbot,&dx,&dy ) ;
  527.                             break ;
  528.                         } else {
  529.                             timedisp() ;
  530.                         }
  531.                         MOS_rdpos( &dbot,&dx,&dy ) ;
  532.                     } while ( dbot == MOS_RIGHT ) ;
  533.                 }
  534.             } while ( pbot != MOS_BOTH ) ;
  535.  
  536.             printf( "\n左クリックでPAUSE OFF , 右クリックでPAUSEキャンセル\n" ) ;
  537. /*-----------------------------------------------------------------------------
  538. **    CDP_pause() をCALLして、PAUSE状態を解除する時に、CDP_FLG_pauseplay
  539. **    の値が 偽 であると、PAUSE時点から演奏が再開(CONTINUE)されます.
  540. **    CDP_fftime(), CDP_rewtime() をCALLすると、CDP_FLG_pauseplay の
  541. **    値は、真 となります.
  542. **    故意に、PAUSE時点から演奏再開をしたい場合にだけ、CDP_FLG_pauseplay の値を
  543. **    操作(偽にする)します.
  544. -----------------------------------------------------------------------------*/
  545.             for ( ;; ) {
  546.                 mosloop( CDP_FALSE,&dbot,&dx,&dy ) ;
  547.                 if ( dbot == MOS_LEFT ) {
  548.                     printf( "指定された時間から演奏を開始します.\n" ) ;
  549.                     break ;
  550.                 } else if ( dbot == MOS_RIGHT ) {
  551.                     CDP_FLG_pauseplay = CDP_FALSE ;
  552.                     printf( "PAUSEされた時点からの演奏を開始します.\n" ) ;
  553.                     break ;
  554.                 }
  555.             }
  556.             mosloop( dbot,&dbot,&dx,&dy ) ;
  557.             CDP_pause() ;
  558.         }
  559.  
  560. /*-----------------------------------------------------------------------------
  561. **    演奏中にCDの情報を取得する時には、以前取得した時よりも 200ms 以上の wait
  562. **    をおいてからにして下さい. そうしないと、音飛びなどの現象を起こします.
  563. -----------------------------------------------------------------------------*/
  564.         if ( c < CDC_WAIT ) {                        /*  wait                */
  565.             c++ ;
  566.         } else {
  567.             c = 0 ;
  568. /*-----------------------------------------------------------------------------
  569. **    演奏中ならば演奏時間の情報を表示し、CDが入れ換えられたならば、最初から演奏
  570. **    し直します.
  571. -----------------------------------------------------------------------------*/
  572.             ret = CDP_status() ;
  573.             if ( CDP_NOW_status == CDP_STAT_PLAY ) {
  574.                 timedisp() ;
  575.             }
  576.             if ( ret == CDP_ERR_CHANGE ) {
  577.                 CDP_play() ;
  578.                 tocdisp() ;
  579.             } else if ( CDP_NOW_status == CDP_STAT_STOP ) {
  580.                 printf( "\n演奏終了しました.\n" ) ;
  581.                 break ;
  582.             }
  583.         }
  584.  
  585.     } while ( mbot != MOS_BOTH ) ;                    /*  左右同時クリックで終了    */
  586.     CURON() ;
  587. }
  588.  
  589. /************************  PAUSE中の次曲/前曲演奏試験  ***********************/
  590. void test5()
  591. {
  592.     int        mbot, mx, my ;                        /*  マウス状態格納変数            */
  593.     int        dbot, dx, dy ;                        /*  マウス状態格納変数            */
  594.     int        pbot, px, py ;                        /*  マウス状態格納変数            */
  595.     int        c ;
  596.     int        ret ;
  597.  
  598.     printf( "\nPAUSE & NEXT / BEFORE  PLAY TEST\n" ) ;
  599.     printf( "左クリックでPAUSE ON/OFF , 右クリックでPAUSEキャンセル , 左右同時クリックで終了\n" ) ;
  600.     printf( "PAUSE中に 左クリックで NEXT , 右クリックで BEFORE , 左右同時クリックで EXIT\n" ) ;
  601.  
  602. /*-----------------------------------------------------------------------------
  603. **    曲単位での先送り/後戻り演奏をする前には、必ず CDP_pause() をCALLして下さ
  604. **    い.
  605. **    PAUSE状態でないと、動作しません.
  606. **    曲単位での先送り/後戻りの時間設定が終わったら、再度 CDP_pause() をCALLし
  607. **    て、PAUSE状態を解除して下さい.
  608. **
  609. **    注意 : CDP_pause() をCALLして、PAUSE状態を解除する時に、CDP_FLG_pauseplay
  610. **           の値が 偽 であると、PAUSE時点から演奏を再開(CONTINUE)します.
  611. **           CDP_ffmusic(), CDP_rewmusic() をCALLすると、
  612. **           CDP_FLG_pauseplay の値は、真 となります.
  613. **           故意に、PAUSE時点から演奏再開をしたい場合にだけ、CDP_FLG_pauseplay
  614. **           の値を操作(偽にする)して下さい.
  615. -----------------------------------------------------------------------------*/
  616.     CUROFF() ;
  617.     c = 0 ;
  618.     do {
  619.         MOS_rdpos( &mbot,&mx,&my ) ;
  620.         if ( mbot == MOS_LEFT && CDP_NOW_status != CDP_STAT_NOTREADY ) {
  621.                                                     /*  左クリック                */
  622.             CDP_pause() ;
  623.             printf( "\nNOW PAUSE!\n" ) ;
  624.             pausedisp() ;
  625.             printf( "\n左クリックで NEXT , 右クリックで BEFORE , 左右同時クリックで EXIT\n" ) ;
  626.             timedisp() ;
  627.  
  628.             do {
  629.                 MOS_rdpos( &pbot,&px,&py ) ;
  630.                 if ( pbot == MOS_LEFT ) {
  631. /*-----------------------------------------------------------------------------
  632. **    CDP_ffmusic() では、次の曲の頭出しをするための設定がされます.
  633. **    最終曲を過ぎたら、パラメタエラーの値が返ってきます.
  634. -----------------------------------------------------------------------------*/
  635.                     do {
  636.                         ret = CDP_ffmusic() ;
  637.                         if ( ret ) {
  638.                             mosloop( MOS_LEFT,&dbot,&dx,&dy ) ;
  639.                             break ;
  640.                         } else {
  641.                             timedisp() ;
  642.                         }
  643.                         MOS_rdpos( &dbot,&dx,&dy ) ;
  644.                     } while ( dbot == MOS_LEFT ) ;
  645.                 } else if ( pbot == MOS_RIGHT ) {
  646. /*-----------------------------------------------------------------------------
  647. **    CDP_rewmusic() では、前の曲の頭出しをするための設定がされます.
  648. **    ただし、現在の演奏時間が曲の先頭時間でなければ、現在の曲の頭出しとなります.
  649. **    既に先頭が設定されている時には、パラメタエラーの値が返ってきます.
  650. -----------------------------------------------------------------------------*/
  651.                     do {
  652.                         ret = CDP_rewmusic() ;
  653.                         if ( ret ) {
  654.                             mosloop( MOS_RIGHT,&dbot,&dx,&dy ) ;
  655.                             break ;
  656.                         } else {
  657.                             timedisp() ;
  658.                         }
  659.                         MOS_rdpos( &dbot,&dx,&dy ) ;
  660.                     } while ( dbot == MOS_RIGHT ) ;
  661.                 }
  662.             } while ( pbot != MOS_BOTH ) ;
  663.  
  664.             printf( "\n左クリックでPAUSE OFF , 右クリックでPAUSEキャンセル\n" ) ;
  665. /*-----------------------------------------------------------------------------
  666. **    CDP_pause() をCALLして、PAUSE状態を解除する時に、CDP_FLG_pauseplay
  667. **    の値が 偽 であると、PAUSE時点から演奏が再開(CONTINUE)されます.
  668. **    CDP_ffmusic(), CDP_rewmusic() をCALLすると、CDP_FLG_pauseplayの
  669. **    値は、真 となります.
  670. **    故意に、PAUSE時点から演奏再開をしたい場合にだけ、CDP_FLG_pauseplay の値を
  671. **    操作(偽にする)します.
  672. -----------------------------------------------------------------------------*/
  673.             for ( ;; ) {
  674.                 mosloop( CDP_FALSE,&dbot,&dx,&dy ) ;
  675.                 if ( dbot == MOS_LEFT ) {
  676.                     printf( "指定された曲の頭から演奏を開始します.\n" ) ;
  677.                     break ;
  678.                 } else if ( dbot == MOS_RIGHT ) {
  679.                     CDP_FLG_pauseplay = CDP_FALSE ;
  680.                     printf( "PAUSEされた時点からの演奏を開始します.\n" ) ;
  681.                     break ;
  682.                 }
  683.             }
  684.             mosloop( dbot,&dbot,&dx,&dy ) ;
  685.             CDP_pause() ;
  686.         }
  687.  
  688. /*-----------------------------------------------------------------------------
  689. **    演奏中にCDの情報を取得する時には、以前取得した時よりも 200ms 以上の wait
  690. **    をおいてからにして下さい. そうしないと、音飛びなどの現象を起こします.
  691. -----------------------------------------------------------------------------*/
  692.         if ( c < CDC_WAIT ) {                        /*  wait                */
  693.             c++ ;
  694.         } else {
  695.             c = 0 ;
  696. /*-----------------------------------------------------------------------------
  697. **    演奏中ならば演奏時間の情報を表示し、CDが入れ換えられたならば、最初から演奏
  698. **    し直します.
  699. -----------------------------------------------------------------------------*/
  700.             ret = CDP_status() ;
  701.             if ( CDP_NOW_status == CDP_STAT_PLAY ) {
  702.                 timedisp() ;
  703.             }
  704.             if ( ret == CDP_ERR_CHANGE ) {
  705.                 CDP_play() ;
  706.                 tocdisp() ;
  707.             } else if ( CDP_NOW_status == CDP_STAT_STOP ) {
  708.                 printf( "\n演奏終了しました.\n" ) ;
  709.                 break ;
  710.             }
  711.         }
  712.  
  713.     } while ( mbot != MOS_BOTH ) ;                    /*  左右同時クリックで終了    */
  714.     CURON() ;
  715. }
  716.  
  717. /****************************  シャッフル番号の確認試験  **************************/
  718. void test6()
  719. {
  720.     int        mbot, mx, my ;                        /*  マウス状態格納変数            */
  721.     int        dbot, dx, dy ;                        /*  マウス状態格納変数            */
  722.     int        c ;
  723.     int        ret ;
  724.  
  725.     printf( "\nSHUFFLE TEST\n" ) ;
  726.     printf( "左クリックでシャッフル , 右クリックでやり直し , 左右同時クリックで終了\n" ) ;
  727.  
  728. /*-----------------------------------------------------------------------------
  729. **    シャッフル演奏は、アプリケーション側で制御します.
  730. **    CDP_shuffle() を CALL すると、次に演奏する曲番号が返ってきます.
  731. **    この曲番号を CDP_NOW_start と CDP_NOW_end にセットして CDP_play() をCALL
  732. **    することによって演奏し、CDP_status() を監視し、CDP_NOW_status が CDP_
  733. **    NOW_STOP になったならば、次の曲番号を CDP_shuffle() にて取得し、演奏をし
  734. **    ます.このような制御をすることによって、シャッフル演奏を実現します.
  735. **
  736. **    CDP_shuffle() では、演奏曲がすべて終わった場合には、0 が返ってきます.
  737. **    シャッフルしなおす場合には、CDP_shuffleinit を 真 にして CDP_shuffle() を
  738. **    CALLします. 一度 CDP_shuffle() をCALLすると、CDP_shuffleinit は 偽 に
  739. **    なります.
  740. **
  741. **    CDP_shuffle() では、トラックデータが音楽でない場合には、その曲番号は無視され
  742. **    て、音楽データの曲番号だけが、返ってきますので、アプリ側でチェックする必要はあり
  743. **    ません.
  744. -----------------------------------------------------------------------------*/
  745.     CUROFF() ;
  746.     c = 0 ;
  747.     ret = CDP_status() ;
  748.     if ( CDP_NOW_status == CDP_STAT_PLAY ) {        /*  演奏中                */
  749.         timedisp() ;
  750.     }
  751.     if ( ret == CDP_ERR_CHANGE ) {                    /*  CDが入れ換えられた    */
  752.         CDP_play() ;
  753.         tocdisp() ;
  754.     }
  755.     do {
  756.         MOS_rdpos( &mbot,&mx,&my ) ;
  757.         if ( mbot == MOS_LEFT && CDP_NOW_status != CDP_STAT_NOTREADY ) {
  758.                                                     /*  マウス左クリック            */
  759. /*-----------------------------------------------------------------------------
  760. -----------------------------------------------------------------------------*/
  761.             printf( "\n\n" ) ;
  762.             for ( ;; ) {
  763.                 CDP_NOW_start = CDP_shuffle() ;
  764.                 if ( !CDP_NOW_start ) {
  765.                     printf( "終わり\n" ) ;
  766.                     break ;
  767.                 } else {
  768.                     printf( "NEXT PLAY ... %d 曲目\n",
  769.                             CDP_NOW_start ) ;
  770.                 }
  771.             }
  772.             mosloop( MOS_LEFT,&dbot,&dx,&dy ) ;        /*  左クリック開放を待つ    */
  773.         }
  774.         if ( mbot == MOS_RIGHT && CDP_NOW_status != CDP_STAT_NOTREADY ) {
  775.                                                     /*  マウス右クリック            */
  776. /*-----------------------------------------------------------------------------
  777. -----------------------------------------------------------------------------*/
  778.             CDP_FLG_shuffleinit = CDP_TRUE ;
  779.             printf( "\n\nシャッフルやり直し ...\n" ) ;
  780.             for ( ;; ) {
  781.                 CDP_NOW_start = CDP_shuffle() ;
  782.                 if ( !CDP_NOW_start ) {
  783.                     printf( "終わり\n" ) ;
  784.                     break ;
  785.                 } else {
  786.                     printf( "NEXT PLAY ... %d 曲目\n",
  787.                             CDP_NOW_start ) ;
  788.                 }
  789.             }
  790.             mosloop( MOS_RIGHT,&dbot,&dx,&dy ) ;    /*  右クリック開放を待つ    */
  791.         }
  792.  
  793. /*-----------------------------------------------------------------------------
  794. **    演奏中にCDの情報を取得する時には、以前取得した時よりも 200ms 以上の wait
  795. **    をおいてからにして下さい. そうしないと、音飛びなどの現象を起こします.
  796. -----------------------------------------------------------------------------*/
  797.         if ( c < CDC_WAIT ) {                        /*  wait                */
  798.             c++ ;
  799.         } else {
  800.             c = 0 ;
  801. /*-----------------------------------------------------------------------------
  802. **    演奏中ならば演奏時間の情報を表示し、CDが入れ換えられたならば、最初から演奏
  803. **    し直します.
  804. -----------------------------------------------------------------------------*/
  805.             ret = CDP_status() ;
  806.             if ( CDP_NOW_status == CDP_STAT_PLAY ) {
  807.                 timedisp() ;
  808.             }
  809.             if ( ret == CDP_ERR_CHANGE ) {
  810.                 CDP_play() ;
  811.                 tocdisp() ;
  812.             }
  813.         }
  814.  
  815.     } while ( mbot != MOS_BOTH ) ;                    /*  左右同時クリックで終了    */
  816.     CURON() ;
  817. }
  818.  
  819. /****************************  シャッフル演奏の確認試験  **************************/
  820. void test7()
  821. {
  822.     int        mbot, mx, my ;                        /*  マウス状態格納変数            */
  823.     int        dbot, dx, dy ;                        /*  マウス状態格納変数            */
  824.     int        c ;
  825.     int        ret ;
  826.     char    dispflg = CDP_TRUE ;
  827.  
  828.     printf( "\nSHUFFLE PLAY\n" ) ;
  829.     printf( "左クリックで次の曲 , 右クリックでやり直し , 左右同時クリックで終了\n" ) ;
  830.  
  831. /*-----------------------------------------------------------------------------
  832. **    シャッフル演奏は、アプリケーション側で制御します.
  833. **    CDP_shuffle() を CALL すると、次に演奏する曲番号が返ってきます.
  834. **    この曲番号を CDP_NOW_start と CDP_NOW_end にセットして CDP_play() をCALL
  835. **    することによって演奏し、CDP_status() を監視し、CDP_NOW_status が CDP_
  836. **    NOW_STOP になったならば、次の曲番号を CDP_shuffle() にて取得し、演奏をし
  837. **    ます.このような制御をすることによって、シャッフル演奏を実現します.
  838. **
  839. **    CDP_shuffle() では、演奏曲がすべて終わった場合には、0 が返ってきます.
  840. **    シャッフルしなおす場合には、CDP_shuffleinit を 真 にして CDP_shuffle() を
  841. **    CALLします. 一度 CDP_shuffle() をCALLすると、CDP_shuffleinit は 偽 に
  842. **    なります.
  843. **
  844. **    CDP_shuffle() では、トラックデータが音楽でない場合には、その曲番号は無視され
  845. **    て、音楽データの曲番号だけが、返ってきますので、アプリ側でチェックする必要はあり
  846. **    ません.
  847. **
  848. **    注意 : 演奏時間については、トラック内の時間だけが有効となります.
  849. **           つまり、CDP_CLOCK_nowtrack と CDP_TIME_nowtrack だけが有効であり
  850. **           CDP_CLOCK_nowdisc と CDP_TIME_nowdisc は無効となります.
  851. **           トータル 時間が必要であれば、CDP_TIME_music と CDP_TIME_track[] を
  852. **           もとに アプリ側で計算して下さい.
  853. **           ただし、CDP_status() の代わりに CDP_shuffletime() を CALL した
  854. **           場合(CALL直後)を除きます. この場合でも、演奏中に限ります.
  855. **           また、CDP_shuffle() をCALLすることによって 残り時間は変化します.
  856. **           そのために、CDP_shuffle() は無闇にCALLしてはいけません.
  857. **
  858. **           CDP_shuffle() 及び CDP_shuffletime() 使用時には、CDP_fftime()
  859. **           , CDP_rewtime(), CDP_ffmusic(), CDP_rewmusic() を
  860. **           使用してはなりません.
  861. **           使用した場合には、それ以降のシャッフル演奏および時間情報は不定となります.
  862. -----------------------------------------------------------------------------*/
  863.     CUROFF() ;
  864.     c = 0 ;
  865.  
  866. /*-----------------------------------------------------------------------------
  867. **    シャッフル演奏時は、必ず演奏回数を最小(1)にします.
  868. -----------------------------------------------------------------------------*/
  869.     CDP_REP_cnt = CDP_MIN_REPEAT ;
  870.  
  871.     ret = CDP_status() ;
  872.     if ( CDP_NOW_status != CDP_STAT_NOTREADY ||    /*  CDがセット状態            */
  873.             ret == CDP_ERR_CHANGE ) {                /*  CDが入れ換えられた    */
  874.         CDP_NOW_start = CDP_NOW_end = CDP_shuffle() ;
  875.         CDP_play() ;
  876.         tocdisp() ;
  877.         printf( "\nSHUFFLE PLAY ... %d 曲目\n",
  878.                 CDP_NOW_start ) ;
  879.     }
  880.  
  881.     do {
  882.         MOS_rdpos( &mbot,&mx,&my ) ;
  883.         if ( mbot == MOS_LEFT && CDP_NOW_status != CDP_STAT_NOTREADY ) {
  884.                                                     /*  マウス左クリック            */
  885. /*-----------------------------------------------------------------------------
  886. **    CDP_shuffle() を CALL すると、次に演奏する曲番号が返ってきます.
  887. **    CDP_shuffle() では、演奏曲がすべて終わった場合には、0 が返ってきます.
  888. -----------------------------------------------------------------------------*/
  889.             CDP_NOW_start = CDP_NOW_end = CDP_shuffle() ;
  890.             if ( !CDP_NOW_start ) {
  891.                 CDP_stop() ;
  892.                 if ( dispflg ) {
  893.                     printf( "\n\n終わり\n" ) ;
  894.                     printf( "右クリックでやり直し , 左右同時クリックで終了\n" ) ;
  895.                 }
  896.                 dispflg = CDP_FALSE ;
  897.             } else {
  898.                 printf( "\n\nNEXT PLAY ... %d 曲目\n",
  899.                         CDP_NOW_start ) ;
  900.                 CDP_play() ;
  901.                 dispflg = CDP_TRUE ;
  902.             }
  903.             mosloop( MOS_LEFT,&dbot,&dx,&dy ) ;        /*  左クリック開放を待つ    */
  904.         }
  905.         if ( mbot == MOS_RIGHT && CDP_NOW_status != CDP_STAT_NOTREADY ) {
  906.                                                     /*  マウス右クリック            */
  907. /*-----------------------------------------------------------------------------
  908. **    シャッフルしなおす場合には、CDP_shuffleinit を 真 にして CDP_shuffle() を
  909. **    CALLします. 一度 CDP_shuffle() をCALLすると、CDP_shuffleinit は 偽 に
  910. **    なります.
  911. -----------------------------------------------------------------------------*/
  912.             CDP_FLG_shuffleinit = CDP_TRUE ;
  913.  
  914.             printf( "\n\nシャッフルやり直し ...\n" ) ;
  915.             CDP_NOW_start = CDP_NOW_end = CDP_shuffle() ;
  916.             if ( !CDP_NOW_start ) {
  917.                 CDP_stop() ;
  918.                 if ( dispflg ) printf( "終わり\n" ) ;
  919.                 dispflg = CDP_FALSE ;
  920.             } else {
  921.                 printf( "SHUFFLE PLAY ... %d 曲目\n",
  922.                         CDP_NOW_start ) ;
  923.                 CDP_play() ;
  924.                 dispflg = CDP_TRUE ;
  925.             }
  926.             mosloop( MOS_RIGHT,&dbot,&dx,&dy ) ;    /*  右クリック開放を待つ    */
  927.         }
  928.  
  929. /*-----------------------------------------------------------------------------
  930. **    演奏中にCDの情報を取得する時には、以前取得した時よりも 200ms 以上の wait
  931. **    をおいてからにして下さい. そうしないと、音飛びなどの現象を起こします.
  932. -----------------------------------------------------------------------------*/
  933.         if ( c < CDC_WAIT ) {                        /*  wait                */
  934.             c++ ;
  935.         } else {
  936.             c = 0 ;
  937. /*-----------------------------------------------------------------------------
  938. **    演奏中ならば演奏時間の情報を表示し、CDが入れ換えられたならば、シャッフル演奏
  939. **    し直します.
  940. **
  941. **    注意 : 演奏時間については、トラック内の時間だけが有効となります.
  942. **           つまり、CDP_CLOCK_nowtrack と CDP_TIME_nowtrack だけが有効であり
  943. **           CDP_CLOCK_nowdisc と CDP_TIME_nowdisc は無効となります.
  944. **           トータル 時間が必要であれば、CDP_TIME_music と CDP_TIME_track[] を
  945. **           もとに アプリ側で計算して下さい.
  946. **           ただし、CDP_status() の代わりに CDP_shuffletime() を CALL した
  947. **           場合(CALL直後)を除きます. この場合でも、演奏中に限ります.
  948. **           また、CDP_shuffle() をCALLすることによって 残り時間は変化します.
  949. **           そのために、CDP_shuffle() は無闇にCALLしてはいけません.
  950. **
  951. **           CDP_shuffle() 及び CDP_shuffletime() 使用時には、CDP_fftime(),
  952. **           CDP_rewtime(), CDP_ffmusic(), CDP_rewmusic() を使用してはなりません.
  953. **           使用した場合には、それ以降のシャッフル演奏および時間情報は不定となります.
  954. -----------------------------------------------------------------------------*/
  955.             ret = CDP_shuffletime() ;
  956.  
  957.             if ( CDP_NOW_status == CDP_STAT_PLAY ) {            /*  演奏中    */
  958.                 timedisp() ;
  959.             } else if ( CDP_NOW_status == CDP_STAT_STOP ) {    /*  停止中    */
  960.                 CDP_NOW_start = CDP_NOW_end = CDP_shuffle() ;
  961.                 if ( !CDP_NOW_start ) {
  962.                     if ( dispflg ) {
  963.                         printf( "\n\n終わり\n" ) ;
  964.                         printf( "右クリックでやり直し , 左右同時クリックで終了\n" ) ;
  965.                     }
  966.                     dispflg = CDP_FALSE ;
  967.                 } else {
  968.                     printf( "\n\nNEXT PLAY ... %d 曲目\n",
  969.                             CDP_NOW_start ) ;
  970.                     CDP_play() ;
  971.                     dispflg = CDP_TRUE ;
  972.                 }
  973.             }
  974.             if ( ret == CDP_ERR_CHANGE ) {
  975.                 CDP_NOW_start = CDP_NOW_end = CDP_shuffle() ;
  976.                 CDP_play() ;
  977.                 tocdisp() ;
  978.                 printf( "\nSHUFFLE PLAY ... %d 曲目\n",
  979.                         CDP_NOW_start ) ;
  980.                 dispflg = CDP_TRUE ;
  981.             }
  982.         }
  983.  
  984.     } while ( mbot != MOS_BOTH ) ;                    /*  左右同時クリックで終了    */
  985.     CURON() ;
  986. }
  987.  
  988. /*****************************  CD演奏ライブラリ試験  ****************************/
  989. void main( int ac,char *av[] )
  990. {
  991.     int        c ;
  992.     int        ret ;
  993.  
  994.     MOS_start( Mwork,MworkSize ) ;
  995.     MOS_disp( CDP_FALSE ) ;                        /* マウス非表示                */
  996.  
  997. /*-----------------------------------------------------------------------------
  998. **    電子ボリュームの設定は、あらかじめアプリケーション側で行う必要があります!
  999. -----------------------------------------------------------------------------*/
  1000.     SND_elevol_init() ;                            /*  電子ボリューム初期化        */
  1001.     SND_elevol_set( 1,127,127 ) ;                /*  CDのボリュームをMAX(L/R)に    */
  1002.  
  1003.     printf( "試験したい機能番号を入力して下さい.\n" ) ;
  1004.     printf( " 1 : NEXT / BEFORE PLAY\n" ) ;
  1005.     printf( " 2 : PAUSE ON/OFF\n" ) ;
  1006.     printf( " 3 : FF / REW PLAY\n" ) ;
  1007.     printf( " 4 : PAUSE 中の FF / REW PLAY\n" ) ;
  1008.     printf( " 5 : PAUSE 中の NEXT / BEFORE PLAY\n" ) ;
  1009.     printf( " 6 : SHUFFLE TEST\n" ) ;
  1010.     printf( " 7 : SHUFFLE PLAY\n" ) ;
  1011.     printf( "\n" ) ;
  1012.     for ( ;; ) {
  1013.         printf( ">" ) ;
  1014.         scanf( "%d",&c ) ;
  1015.         if ( c >= 0 && c < 8 ) break ;
  1016.     }
  1017.     printf( "\n" ) ;
  1018.  
  1019. /*-----------------------------------------------------------------------------
  1020. **    初期状態が演奏中かどうかをチェックする必要がなければ、あらかじめ CDP_status()
  1021. **    をCALLする必要はありません.
  1022. -----------------------------------------------------------------------------*/
  1023.     printf( "初期状態 ... " ) ;
  1024.     ret = CDP_status() ;
  1025.     switch ( CDP_NOW_status ) {
  1026.         case CDP_STAT_NOTREADY :
  1027.             printf( "CDがセットされていません.\n" ) ;
  1028.             break ;
  1029.         case CDP_STAT_STOP :
  1030.             printf( "CDが入っています.\n" ) ;
  1031.             break ;
  1032.         case CDP_STAT_PLAY :
  1033.             printf( "演奏中です.\n" ) ;
  1034.             break ;
  1035.         case CDP_STAT_PAUSE :
  1036.             printf( "一時停止中です.\n" ) ;
  1037.             break ;
  1038.         default :
  1039.             printf( "わかんない ???\n" ) ;
  1040.     }
  1041.     CDP_debug_dispmsg( ret ) ;
  1042.  
  1043. /*-----------------------------------------------------------------------------
  1044. **    演奏を開始する前に、TOC 情報を必要としなければ、あらかじめ CDP_tocread()
  1045. **    をCALLする必要はありません.
  1046. -----------------------------------------------------------------------------*/
  1047.     printf( "\nTOC情報読み込み ...\n" ) ;
  1048.     ret = CDP_tocread() ;
  1049.     if ( ret ) {
  1050.         printf( "TOC読み込み失敗\n" ) ;
  1051.     } else {
  1052.         printf( "TOC読み込み成功!\n" ) ;
  1053.         tocdisp() ;
  1054.     }
  1055.  
  1056. /*-----------------------------------------------------------------------------
  1057. **    演奏を開始する時に、演奏開始曲/終了曲等の各パラメタを設定する必要がある場合に
  1058. **    は、必ず前もって CDP_status() か CDP_tocread() をCALLしておく必要があり
  1059. **    ます. 
  1060. **    ただし、最初だけであり、一度でも CDP_*****() をCALLしていれば、必要ありま
  1061. **    せん.
  1062. **    
  1063. **    演奏開始曲番号は、CDP_NOW_start にセットします.(省略値は、最初の曲)
  1064. **    演奏終了曲番号は、CDP_NOW_end にセットします.(省略値は、最後の曲)
  1065. **    繰り返し演奏回数は、CDP_REP_cnt にセットします.(省略値は、1回)
  1066. **    ただし、これらのパラメタに誤りがあると、CDP_****() は、パラメタエラーを返します.
  1067. -----------------------------------------------------------------------------*/
  1068.     printf( "\nPLAY ... %d 曲目 ~ %d 曲目\n",
  1069.         CDP_NOW_start,CDP_NOW_end ) ;
  1070.     CDP_debug_dispmsg( CDP_play() ) ;
  1071. /*-----------------------------------------------------------------------------
  1072. **    デバッグ用に CDP_status() をCALLしていますが、CDP_play() をCALLした直後
  1073. **    であれば、CDP_status() をCALLしなくても、情報はグローバル変数にセットされてい
  1074. **    ます.
  1075. -----------------------------------------------------------------------------*/
  1076.     printf( "実際の演奏曲は、%d 曲目 ~ %d 曲目\n演奏後の状態 ... ",
  1077.         CDP_NOW_start,CDP_NOW_end ) ;
  1078.     CDP_debug_dispmsg( CDP_status() ) ;
  1079.  
  1080.     switch ( c ) {
  1081.         case 1 :
  1082.             test1() ;
  1083.             break ;
  1084.         case 2 :
  1085.             test2() ;
  1086.             break ;
  1087.         case 3 :
  1088.             test3() ;
  1089.             break ;
  1090.         case 4 :
  1091.             test4() ;
  1092.             break ;
  1093.         case 5 :
  1094.             test5() ;
  1095.             break ;
  1096.         case 6 :
  1097.             test6() ;
  1098.             break ;
  1099.         case 7 :
  1100.             test7() ;
  1101.             break ;
  1102.     }
  1103.  
  1104.     if ( ac > 1 ) CDP_stop() ;                    /*  引数ありならばSTOP        */
  1105.     MOS_end() ;                                    /*  マウス終了                    */
  1106. }
  1107.  
  1108.